使用OpenResty进行限流的基本配置

您所在的位置:网站首页 openresty 限流源码 使用OpenResty进行限流的基本配置

使用OpenResty进行限流的基本配置

2023-12-05 22:23| 来源: 网络整理| 查看: 265

使用OpenResty进行限流的基本配置 1.安装OpenResty1. 添加仓库执行命令2. 执行安装3. 安装成功后 会在默认的目录如下: 2.安装nginx3.测试访问4.广告的载入和读取1.声明nginx缓存2.在/root/lua目录下创建read_content.lua:3.在nginx.conf中进行调用 5. 控制并发量1. nginx的限流(1) 控制速率处理突发流量 (2) 控制并发量 以商城轮播广告为例 采用多级缓存的方式来减少下游系统的服务压力。

先查询openresty本地缓存 ,如果没有,再查询redis中的数据,如果没有,再查询mysql中的数据,但凡有数据 则返回即可。 记录使用OpenResty(Nginx+lua)进行限流最基础的配置。

1.安装OpenResty 1. 添加仓库执行命令 yum install yum-utils yum-config-manager --add-repo https://openresty.org/package/centos/openresty.repo 2. 执行安装 yum install openresty 3. 安装成功后 会在默认的目录如下: /usr/local/openresty 2.安装nginx

默认已经安装好了nginx,在目录:/usr/local/openresty/nginx 下。

修改/usr/local/openresty/nginx/conf/nginx.conf,将配置文件使用的根设置为root,目的就是将来要使用lua脚本的时候 ,直接可以加载在root下的lua脚本。

cd /usr/local/openresty/nginx/conf vi nginx.conf

修改代码如下: 在这里插入图片描述

3.测试访问

重启下centos虚拟机,然后访问测试Nginx

访问地址:http://192.168.211.132/ 在这里插入图片描述

4.广告的载入和读取

实现思路: 先查询openresty本地缓存 如果 没有

再查询redis中的数据,如果没有

再查询mysql中的数据,但凡有数据 则返回即可。

1.声明nginx缓存 lua_shared_dict dis_cache 128m; 2.在/root/lua目录下创建read_content.lua: ngx.header.content_type="application/json;charset=utf8" local uri_args = ngx.req.get_uri_args(); local id = uri_args["id"]; --获取本地缓存 local cache_ngx = ngx.shared.dis_cache; --根据ID 获取本地缓存数据 local contentCache = cache_ngx:get('content_cache_'..id); if contentCache == "" or contentCache == nil then local redis = require("resty.redis"); local red = redis:new() red:set_timeout(2000) red:connect("192.168.211.132", 6379) local rescontent=red:get("content_"..id); if ngx.null == rescontent then local cjson = require("cjson"); local mysql = require("resty.mysql"); local db = mysql:new(); db:set_timeout(2000) local props = { host = "192.168.211.132", port = 3306, database = "changgou_content", user = "root", password = "123456" } local res = db:connect(props); local select_sql = "select url,pic from tb_content where status ='1' and category_id="..id.." order by sort_order"; res = db:query(select_sql); local responsejson = cjson.encode(res); red:set("content_"..id,responsejson); ngx.say(responsejson); db:close() else cache_ngx:set('content_cache_'..id, rescontent, 10*60); ngx.say(rescontent) end red:close() else ngx.say(contentCache) end 3.在nginx.conf中进行调用

在/usr/local/openresty/nginx/conf/nginx.conf中配置如下:

location /read_content { content_by_lua_file /root/lua/read_content.lua; } 5. 控制并发量 1. nginx的限流

nginx提供两种限流的方式:

一是控制速率二是控制并发连接数 (1) 控制速率 nginx的配置示意图如下 在这里插入图片描述 修改/usr/local/openresty/nginx/conf/nginx.conf: user root root; worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; #cache lua_shared_dict dis_cache 128m; #限流设置 limit_req_zone $binary_remote_addr zone=contentRateLimit:10m rate=2r/s; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; server { listen 80; server_name localhost; location /update_content { content_by_lua_file /root/lua/update_content.lua; } location /read_content { #使用限流配置 limit_req zone=contentRateLimit; content_by_lua_file /root/lua/read_content.lua; } } }

配置说明:

binary_remote_addr 是一种key,表示基于 remote_addr(客户端IP) 来做限流,binary_ 的目的是压缩内存占用量。 zone:定义共享内存区来存储访问信息, contentRateLimit:10m 表示一个大小为10M,名字为contentRateLimit的内存区域。1M能存储16000 IP地址的访问信息,10M可以存储16W IP地址访问信息。 rate 用于设置最大访问速率,rate=10r/s 表示每秒最多处理10个请求。Nginx 实际上以毫秒为粒度来跟踪请求信息,因此 10r/s 实际上是限制:每100毫秒处理一个请求。这意味着,自上一个请求处理完后,若后续100毫秒内又有请求到达,将拒绝处理该请求.我们这里设置成2 方便测试。 处理突发流量

上面例子限制 2r/s,如果有时正常流量突然增大,超出的请求将被拒绝,无法处理突发流量,可以结合 burst 参数使用来解决该问题。

例如,如下配置表示: 在这里插入图片描述 上图代码如下:

server { listen 80; server_name localhost; location /update_content { content_by_lua_file /root/lua/update_content.lua; } location /read_content { limit_req zone=contentRateLimit burst=4; content_by_lua_file /root/lua/read_content.lua; } }

burst 译为突发、爆发,表示在超过设定的处理速率后能额外处理的请求数,当 rate=10r/s 时,将1s拆成10份,即每100ms可处理1个请求。

此处,burst=4 ,若同时有4个请求到达,Nginx 会处理第一个请求,剩余3个请求将放入队列,然后每隔500ms从队列中获取一个请求进行处理。若请求数大于4,将拒绝处理多余的请求,直接返回503.

不过,单独使用 burst 参数并不实用。假设 burst=50 ,rate依然为10r/s,排队中的50个请求虽然每100ms会处理一个,但第50个请求却需要等待 50 * 100ms即 5s,这么长的处理时间自然难以接受。

因此,burst 往往结合 nodelay 一起使用。

例如:如下配置:

server { listen 80; server_name localhost; location /update_content { content_by_lua_file /root/lua/update_content.lua; } location /read_content { limit_req zone=contentRateLimit burst=4 nodelay; content_by_lua_file /root/lua/read_content.lua; } }

如上表示:

平均每秒允许不超过2个请求,突发不超过4个请求,并且处理突发4个请求的时候,没有延迟,等到完成之后,按照正常的速率处理。

如上两种配置结合就达到了速率稳定,但突然流量也能正常处理的效果。完整配置代码如下:

user root root; worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; #cache lua_shared_dict dis_cache 128m; #限流设置 limit_req_zone $binary_remote_addr zone=contentRateLimit:10m rate=2r/s; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; server { listen 80; server_name localhost; location /update_content { content_by_lua_file /root/lua/update_content.lua; } location /read_content { limit_req zone=contentRateLimit burst=4 nodelay; content_by_lua_file /root/lua/read_content.lua; } } } (2) 控制并发量

ngx_http_limit_conn_module 提供了限制连接数的能力。主要是利用limit_conn_zone和limit_conn两个指令。

利用连接数限制 某一个用户的ip连接的数量来控制流量。

注意:并非所有连接都被计算在内 只有当服务器正在处理请求并且已经读取了整个请求头时,才会计算有效连接。此处忽略测试。

配置语法:

Syntax: limit_conn zone number; Default: —; Context: http, server, location;

(1)配置限制固定连接数

如下,配置如下: 在这里插入图片描述 上图配置如下:

http { include mime.types; default_type application/octet-stream; #cache lua_shared_dict dis_cache 128m; #限流设置 limit_req_zone $binary_remote_addr zone=contentRateLimit:10m rate=2r/s; #根据IP地址来限制,存储内存大小10M limit_conn_zone $binary_remote_addr zone=addr:1m; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; server { listen 80; server_name localhost; #所有以brand开始的请求,访问本地changgou-service-goods微服务 location /brand { limit_conn addr 2; proxy_pass http://192.168.211.1:18081; } location /update_content { content_by_lua_file /root/lua/update_content.lua; } location /read_content { limit_req zone=contentRateLimit burst=4 nodelay; content_by_lua_file /root/lua/read_content.lua; } } }

表示:

limit_conn_zone $binary_remote_addr zone=addr:10m; 表示限制根据用户的IP地址来显示,设置存储地址为的内存大小10M limit_conn addr 2; 表示 同一个地址只允许连接2次。

限制每个客户端IP与服务器的连接数,同时限制与虚拟服务器的连接总数。 如下配置:

limit_conn_zone $binary_remote_addr zone=perip:10m; limit_conn_zone $server_name zone=perserver:10m; server { listen 80; server_name localhost; charset utf-8; location / { limit_conn perip 10;#单个客户端ip与服务器的连接数. limit_conn perserver 100; #限制与服务器的总连接数 root html; index index.html index.htm; } }


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3